home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / F2JW / trans / comp.cpp < prev    next >
C/C++ Source or Header  |  1999-08-22  |  6KB  |  248 lines

  1. //
  2. // フランス語 → 日本語 翻訳プログラム
  3. //
  4. // 形容詞、副詞 比較級 解析部
  5. //
  6.  
  7. #include "stdafx.h"
  8. #include    <string.h>
  9. #include    <ctype.h>
  10.  
  11. #include    "f2j.h"
  12. #include    "myprot.h"
  13.  
  14. extern    TOKEN        *currentTree;
  15. extern    ADVERB        dic_adverb_NE;
  16. extern    ADVERB        dic_adverb_Y;
  17. extern    ARTICLE        articleTable[];
  18. extern    PRONOUN        objectNounTable[];
  19. extern    BOOL        isChanged;
  20. extern    JP_PREPOSITION    dic_jpPreposition_DE[];
  21. extern    PRONOUN        nullPronoun;
  22. extern    PREPOSITION    dic_preposition_en_de;
  23.  
  24. //
  25. // <Plus / Moins> + 形容詞/副詞 ->比較形容詞 / 副詞
  26. //
  27. void
  28. CombinePlusAdjective(TOKEN *start)
  29. {
  30.     TOKEN    *p;
  31.     TOKEN    *lastPlus = NULL;
  32.  
  33.     for(p = start; p && p->next; p = p->next) {
  34.         TOKEN    *next = p->next;
  35.         if((p->frPart == FR_PART_SPECIAL_PLUS
  36.          || p->frPart == FR_PART_SPECIAL_MOINS
  37.          || p->frPart == FR_PART_SPECIAL_AUSSI
  38.          || p->frPart == FR_PART_SPECIAL_SI)
  39.         && (IsObjectMatch(next, FR_PART_ADJECTIVE_GENERAL)
  40.          || IsObjectMatch(next, FR_PART_ADVERB_GENERAL))
  41.         && (next->frAttrib & FR_ATTRIB_COMPARE) == 0) {
  42.             lastPlus = p;
  43.         }
  44.     }
  45.     if(lastPlus == NULL)    return;
  46.  
  47.     TOKEN    *adj = lastPlus->next;
  48.     DisconnectTOKEN(start, lastPlus);
  49.  
  50.     FR_ATTRIB    frAttrib;
  51.     switch(lastPlus->frPart) {
  52.     case FR_PART_SPECIAL_PLUS:    frAttrib = FR_ATTRIB_PLUS;    break;
  53.     case FR_PART_SPECIAL_MOINS:    frAttrib = FR_ATTRIB_MOINS;    break;
  54.     case FR_PART_SPECIAL_AUSSI:    frAttrib = FR_ATTRIB_AUSSI;    break;
  55.     case FR_PART_SPECIAL_SI:    frAttrib = FR_ATTRIB_SI;    break;
  56.     }
  57.     adj->frAttrib = (FR_ATTRIB)(adj->frAttrib | frAttrib);
  58. }
  59.  
  60. BOOL
  61. IsValue1(TOKEN *p)
  62. {
  63.     return(p->value == 1);
  64. }
  65.  
  66.  
  67. BOOL
  68. IsAttribPluralPlus(TOKEN *p)
  69. {
  70.     if((p->frAttrib & FR_ATTRIB_PLURAL)
  71.     && (p->frAttrib & FR_ATTRIB_PLUS))
  72.         return(TRUE);
  73.     else
  74.         return(FALSE);
  75. }
  76.  
  77. CMP_TOKEN    pat_OneOfTheMost[] = {
  78.     CMP_TOKEN( FR_PART_NUMETRIC_NUMBER,    JP_PROP_NONE,    IsValue1),
  79.     CMP_TOKEN( FR_PART_SPECIAL_DES,        JP_PROP_NONE,    NULL),
  80.     CMP_TOKEN( (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL),
  81.                                 JP_PROP_NONE,    IsAttribPluralPlus    ),
  82.     CMP_TOKEN(FR_PART_NONE)
  83. };
  84.  
  85.  
  86. //
  87. // 定冠詞 + 比較形容詞 / 副詞 -> 最上級形容詞 / 副詞
  88. //
  89. void
  90. CombineArticleAdjective(TOKEN *start)
  91. {
  92.     TOKEN    *p;
  93.     TOKEN    *lastPlus = NULL;
  94.  
  95.     for(p = start; p && p->next; p = p->next) {
  96.         TOKEN    *next = p->next;
  97.         // le plus~, le moins~
  98.         if((IsObjectMatch(p, FR_PART_ARTICLE_DEFINIT)
  99.          || IsObjectMatch(p, (FR_PART)(FR_PART_ADJECTIVE_DEMONSTRATIVE | FR_PART_ADJECTIVE_POSSESIVE)))
  100.         && (next->frAttrib & (FR_ATTRIB)(FR_ATTRIB_PLUS | FR_ATTRIB_MOINS))) {
  101.             if(next->frAttrib & FR_ATTRIB_PLUS)        next->frAttrib = FR_ATTRIB_LE_PLUS;
  102.             if(next->frAttrib & FR_ATTRIB_MOINS)    next->frAttrib = FR_ATTRIB_LE_MOINS;
  103.             if(p->frPart & FR_PART_ARTICLE)
  104.                 DisconnectTOKEN(start, p);
  105.             p = next;
  106.         }
  107.         // une des plus~, une des moins~
  108.         if(IsPatternMatch(pat_OneOfTheMost, p)) {
  109.             TOKEN    *adj = p->next->next;
  110.             DisconnectTOKEN(start, p->next);    // desを取り除く
  111.             DisconnectTOKEN(start, p);            // uneを取り除く
  112.             adj->frAttrib = (FR_ATTRIB)(FR_ATTRIB_PLURAL
  113.                 | FR_ATTRIB_ONE_OF_MOST 
  114.                 | (adj->frAttrib & FR_ATTRIB_BOTH_SEX));
  115.             p = next;
  116.         }
  117.     }
  118. }
  119.  
  120.  
  121. //
  122. // 最低比較級を最高比較級に
  123. // le moins 形容詞 -> le plus 形容詞
  124. //
  125. #if 1
  126. BOOL
  127. FlipCmpAdjective(TOKEN *parent, TOKEN *p)
  128. {
  129.     FR_ATTRIB    frAttrib = (FR_ATTRIB)(p->frAttrib & (FR_ATTRIB)(FR_ATTRIB_MOINS | FR_ATTRIB_LE_MOINS));
  130.  
  131.     if(frAttrib == FR_ATTRIB_NONE
  132.     || p->which == NULL)    return(FALSE);
  133.  
  134.     if((parent->frPart & FR_PART_VERB)
  135.     && frAttrib == FR_ATTRIB_MOINS) {
  136.         if(parent->jpProp & JP_PROP_NEGATIVE) {
  137.             // Je ne suis pas moin {l{gante que Jean.
  138.             //    私はジャンより低度に上品でない。
  139.             // -> 私はジャンに劣らず上品だ。
  140.             parent->jpProp &= ~JP_PROP_NEGATIVE;
  141.             p->frAttrib = (FR_ATTRIB)(p->frAttrib & ~FR_ATTRIB_MOINS);
  142.             p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_NE_MOINS);
  143.             return(TRUE);
  144.         } else {
  145.             // Je suis moins gran Jean.
  146.             //    私はジャンより低度に高い。
  147.             // -> 私はジャンほど高くない。
  148.             parent->jpProp |= JP_PROP_NEGATIVE;
  149.             p->frAttrib = (FR_ATTRIB)(p->frAttrib & ~FR_ATTRIB_MOINS);
  150.             p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_SI);
  151.             return(TRUE);
  152.         }
  153.     }
  154.  
  155.     if(FlipAdjective(p)) {
  156.         p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_LE_PLUS);
  157.         return(TRUE);
  158.     }
  159.     return(FALSE);
  160. }
  161.  
  162. #else
  163. BOOL
  164. FlipCmpAdjective(TOKEN *p)
  165. {
  166.     FR_ATTRIB    frAttrib = (FR_ATTRIB)(p->frAttrib & (FR_ATTRIB)(FR_ATTRIB_MOINS | FR_ATTRIB_LE_MOINS));
  167.  
  168.     if(frAttrib == FR_ATTRIB_NONE
  169.     || p->which == NULL)    return(FALSE);
  170.  
  171.     if(FlipAdjective(p)) {
  172.         if(frAttrib & FR_ATTRIB_LE_MOINS)
  173.             p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_LE_PLUS);
  174.         else
  175.             p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_PLUS);
  176.         return(TRUE);
  177.     }
  178.     return(FALSE);
  179. }
  180. #endif
  181.  
  182. BOOL
  183. FlipAdjective(TOKEN *p)
  184. {
  185.     if(IsObjectMatch(p, FR_PART_ADJECTIVE_GENERAL)) {
  186.         JP_ADJECTIVE *jpAdj = (JP_ADJECTIVE *)p->which;
  187.         if(jpAdj->opposite) {
  188.             ChangeToAdjective(p, jpAdj->opposite);
  189.             return(TRUE);
  190.         }
  191.     } else if(IsObjectMatch(p, FR_PART_ADVERB_GENERAL)) {
  192.         JP_ADVERB *jpAdv = (JP_ADVERB *)p->which;
  193.         if(jpAdv->opposite) {
  194.             ChangeToAdverb(p, jpAdv->opposite);
  195.             return(TRUE);
  196.         }
  197.     }
  198.     return(FALSE);
  199. }
  200.  
  201.  
  202.  
  203. BOOL
  204. IsTokenNumFois(TOKEN *p)
  205. {
  206.     NOUN *noun = (NOUN *)p->what;
  207.  
  208.     if(p->frPart == FR_PART_NOUN_GENERAL
  209.     && !strcmp(noun->french, "fois")
  210.     && SearchToken(FR_PART_NUMETRIC_NUMBER, p->child))
  211.         return(TRUE);
  212.  
  213.     return(FALSE);
  214. }
  215.  
  216. BOOL
  217. IsTokenCompare(TOKEN *p)
  218. {
  219.     if(p->frAttrib & (FR_ATTRIB)(FR_ATTRIB_PLUS | FR_ATTRIB_MOINS))
  220.         return(TRUE);
  221.     else
  222.         return(FALSE);
  223. }
  224.  
  225. CMP_TOKEN    pat_NumFoisAdj[] = {
  226.     // elle est cinq fois plus belle,
  227.     CMP_TOKEN( FR_PART_NOUN_GENERAL,    JP_PROP_UNIT,    IsTokenNumFois),
  228.     CMP_TOKEN( (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL),
  229.                                         JP_PROP_NONE,    IsTokenCompare),
  230.     CMP_TOKEN( FR_PART_NONE)
  231. };
  232.  
  233. //
  234. // 数値 + fois + 比較形容詞/副詞
  235. //
  236. void
  237. CombineNumFoisAdjective(TOKEN *start)
  238. {
  239.     TOKEN *p;
  240.     for(p = start; p; p = p->next) {
  241.         if(IsPatternMatch(pat_NumFoisAdj, p)) {
  242.             DisconnectTOKEN(start, p->next);    // "fois"
  243.             DisconnectTOKEN(start, p);            // number
  244.         }
  245.     }
  246. }
  247.  
  248.